package com.tender.utils;

import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomUtils;

import java.net.InetAddress;

@Slf4j
public class SnowFlakeUtil {

    /**
     * 雪花算法对象
     */
    private static final Snowflake SNOW_FLAKE = IdUtil.getSnowflake(getWorkId(), getDataCenterId());


    /**
     * 获取雪花ID
     * @return ID
     */

    public static synchronized String nextId() {
        return SNOW_FLAKE.nextIdStr();
    }


    /**
     * 根据IP Address 生成workId
     * 工作机器ID(0~31)，2进制5位  32位减掉1位 31个
     */
    private static long getWorkId() {
        try {
            String hostName = InetAddress.getLocalHost().getHostName();
            return Math.abs(hostName.hashCode() % 32);
        } catch (Exception e) {
            log.error("根据IP获取workId失败。", e);
            // 如果获取失败，则使用随机数备用
            return RandomUtils.nextLong(0, 31);
        }
    }


    /**
     * dataCenterId使用hostName生成
     * 数据中心ID(0~31)，2进制5位  32位减掉1位 31个
     */
    private static long getDataCenterId() {
        try {
            String hostAddress = InetAddress.getLocalHost().getHostAddress();
            return Math.abs(hostAddress.hashCode() % 32);
        } catch (Exception e) {
            // 失败就随机
            return RandomUtils.nextLong(0, 31);
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println("生成的雪花 ID: " + SNOW_FLAKE.nextId());
        }
    }

}
